﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace NetDXY
{
    class DllInvoke
    {
        /* <SUMMARY>
        /// 打开设备
        /// </SUMMARY>
        /// <PARAM NAME="LPFILENAME">要打开的文件的名字</PARAM>
        /// <PARAM NAME="DWDESIREDACCESS">如果为 GENERIC_READ 表示允许对设备进行读访问；如果为 GENERIC_WRITE 表示允许对设备进行写访问（可组合使用）；如果为零，表示只允许获取与一个设备有关的信息 </PARAM>
        /// <PARAM NAME="DWSHAREMODE">零表示不共享； FILE_SHARE_READ 和 / 或 FILE_SHARE_WRITE 表示允许对文件进行共享访问</PARAM>
        /// <PARAM NAME="LPSECURITYATTRIBUTES">指向安全属性的指针</PARAM>
        /// <PARAM NAME="DWCREATIONDISPOSITION">如何创建(CREATE_NEW 创建文件；如文件存在则会出错 CREATE_ALWAYS 创建文件，会改写前一个文件 OPEN_EXISTING 文件必须已经存在。由设备提出要求 OPEN_ALWAYS 如文件不存在则创建它 TRUNCATE_EXISTING 讲现有文件缩短为零长度 )</PARAM>
        /// <PARAM NAME="DWFLAGSANDATTRIBUTES">文件属性,可由一个或多个下述常数组成 </PARAM>
        /// <PARAM NAME="HTEMPLATEFILE">如果不为零，则指定一个文件句柄。新文件将从这个文件中复制扩展属性 </PARAM>
        /// <RETURNS>如执行成功，则返回文件句柄。 INVALID_HANDLE_VALUE 表示出错，会设置 GETLASTERROR 。即使函数成功，但若文件存在，且指定了 CREATE_ALWAYS 或 OPEN_ALWAYS ， GETLASTERROR 也会设为 ERROR_ALREADY_EXISTS </RETURNS>*/
        [DllImport("coredll", SetLastError = true)]
        public static extern IntPtr CreateFile(
            String lpFileName,
            UInt32 dwDesiredAccess,
            UInt32 dwShareMode,
            IntPtr lpSecurityAttributes,
            UInt32 dwCreationDisposition,
            UInt32 dwFlagsAndAttributes,
            IntPtr hTemplateFile);
        /*// <SUMMARY>
        /// 与驱动程序进行通信，包括读和写两种操作
        /// </SUMMARY>
        /// <PARAM NAME="HDEVICE">CREATEFILE返回的设备句柄</PARAM>
        /// <PARAM NAME="DWIOCONTROLCODE">应用程序调用驱动程序的控制命令，根据具体的设备有相关的定义 </PARAM>
        /// <PARAM NAME="LPINBUFFER">应用程序传递给驱动程序的数据缓冲区地址</PARAM>
        /// <PARAM NAME="NINBUFFERSIZE">应用程序传递给驱动程序的数据缓冲区大小，字节数</PARAM>
        /// <PARAM NAME="LPOUTBUFFER">驱动程序返回给应用程序的数据缓冲区地址</PARAM>
        /// <PARAM NAME="NOUTBUFFERSIZE">驱动程序返回给应用程序的数据缓冲区大小，字节数</PARAM>
        /// <PARAM NAME="LPBYTESRETURNED">驱动程序实际返回给应用程序的数据字节数地址</PARAM>
        /// <PARAM NAME="LPOVERLAPPED">重叠操作结构</PARAM>
        /// <RETURNS>非0成功，0失败</RETURNS>
        /// */

        [DllImport("coredll.dll", EntryPoint = "DeviceIoControl", SetLastError = true)]
        internal static extern int DeviceIoControlCE(
            IntPtr hDevice,
            UInt32 dwIoControlCode,
            Byte[] lpInBuffer,
            UInt32 nInBufferSize,
            Byte[] lpOutBuffer,
            UInt32 nOutBufferSize,
            UInt32 lpBytesReturned,
            IntPtr lpOverlapped);

        [DllImport("coredll.dll")]
        public static extern bool CloseHandle(IntPtr hDevice);

    }
}
